gdm/batch.js \
gdm/fingerprint.js \
gdm/loginDialog.js \
+ gdm/oVirt.js \
gdm/realmd.js \
gdm/util.js \
extensionPrefs/main.js \
this._userVerifier.connect('verification-complete', Lang.bind(this, this._onVerificationComplete));
this._userVerifier.connect('reset', Lang.bind(this, this._onReset));
this._userVerifier.connect('smartcard-status-changed', Lang.bind(this, this._onSmartcardStatusChanged));
+ this._userVerifier.connect('ovirt-user-authenticated', Lang.bind(this, this._onOVirtUserAuthenticated));
this.smartcardDetected = this._userVerifier.smartcardDetected;
this.connect('next', Lang.bind(this, function() {
this.emit('prompted');
},
+ _onOVirtUserAuthenticated: function() {
+ if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
+ this.reset();
+ },
+
_onSmartcardStatusChanged: function() {
this.smartcardDetected = this._userVerifier.smartcardDetected;
// The user is constant at the unlock screen, so it will immediately
// respond to the request with the username
beginRequestType = BeginRequestType.PROVIDE_USERNAME;
- } else if (this.smartcardDetected &&
- this._userVerifier.serviceIsForeground(GdmUtil.SMARTCARD_SERVICE_NAME)) {
+ } else if (this._userVerifier.serviceIsForeground(GdmUtil.OVIRT_SERVICE_NAME) ||
+ (this.smartcardDetected &&
+ this._userVerifier.serviceIsForeground(GdmUtil.SMARTCARD_SERVICE_NAME))) {
// We don't need to know the username if the user preempted the login screen
- // with a smartcard.
+ // with a smartcard or with preauthenticated oVirt credentials
beginRequestType = BeginRequestType.DONT_PROVIDE_USERNAME;
} else {
// In all other cases, we should get the username up front.
--- /dev/null
+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+
+const Gio = imports.gi.Gio;
+const Lang = imports.lang;
+const Signals = imports.signals;
+
+const OVirtCredentialsIface = <interface name='org.ovirt.vdsm.Credentials'>
+<signal name="UserAuthenticated">
+ <arg type="s" name="token"/>
+</signal>
+</interface>;
+
+const OVirtCredentialsInfo = Gio.DBusInterfaceInfo.new_for_xml(OVirtCredentialsIface);
+
+let _oVirtCredentialsManager = null;
+
+function OVirtCredentials() {
+ var self = new Gio.DBusProxy({ g_connection: Gio.DBus.system,
+ g_interface_name: OVirtCredentialsInfo.name,
+ g_interface_info: OVirtCredentialsInfo,
+ g_name: 'org.ovirt.vdsm.Credentials',
+ g_object_path: '/org/ovirt/vdsm/Credentials',
+ g_flags: (Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
+ self.init(null);
+ return self;
+}
+
+const OVirtCredentialsManager = new Lang.Class({
+ Name: 'OVirtCredentialsManager',
+ _init: function() {
+ this._token = null;
+
+ this._credentials = new OVirtCredentials();
+ this._credentials.connectSignal('UserAuthenticated',
+ Lang.bind(this, this._onUserAuthenticated));
+ },
+
+ _onUserAuthenticated: function(proxy, sender, [token]) {
+ this._token = token;
+ this.emit('user-authenticated', token);
+ },
+
+ hasToken: function() {
+ return this._token != null;
+ },
+
+ getToken: function() {
+ return this._token;
+ },
+
+ resetToken: function() {
+ this._token = null;
+ }
+});
+Signals.addSignalMethods(OVirtCredentialsManager.prototype);
+
+function getOVirtCredentialsManager() {
+ if (!_oVirtCredentialsManager)
+ _oVirtCredentialsManager = new OVirtCredentialsManager();
+
+ return _oVirtCredentialsManager;
+}
const Batch = imports.gdm.batch;
const Fprint = imports.gdm.fingerprint;
+const OVirt = imports.gdm.oVirt;
const Main = imports.ui.main;
const Params = imports.misc.params;
const ShellEntry = imports.ui.shellEntry;
const PASSWORD_SERVICE_NAME = 'gdm-password';
const FINGERPRINT_SERVICE_NAME = 'gdm-fingerprint';
const SMARTCARD_SERVICE_NAME = 'gdm-smartcard';
+const OVIRT_SERVICE_NAME = 'gdm-ovirtcred';
const FADE_ANIMATION_TIME = 0.16;
const CLONE_FADE_ANIMATION_TIME = 0.25;
this.reauthenticating = false;
this._failCounter = 0;
+
+ this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager();
+
+ if (this._oVirtCredentialsManager.hasToken())
+ this._oVirtUserAuthenticated(this._oVirtCredentialsManager.getToken());
+
+ this._oVirtCredentialsManager.connect('user-authenticated',
+ Lang.bind(this, this._oVirtUserAuthenticated));
},
begin: function(userName, hold) {
}));
},
+ _oVirtUserAuthenticated: function(token) {
+ this._preemptingService = OVIRT_SERVICE_NAME;
+ this.emit('ovirt-user-authenticated');
+ },
+
_checkForSmartcard: function() {
let smartcardDetected;
if (!this.serviceIsForeground(serviceName))
return;
+ if (serviceName == OVIRT_SERVICE_NAME) {
+ // The only question asked by this service is "Token?"
+ this.answerQuery(serviceName, this._oVirtCredentialsManager.getToken());
+ return;
+ }
+
this.emit('ask-question', serviceName, secretQuestion, '\u25cf');
},
},
_onConversationStopped: function(client, serviceName) {
+ // If the login failed with the preauthenticated oVirt credentials
+ // then discard the credentials and revert to default authentication
+ // mechanism.
+ if (this.serviceIsForeground(OVIRT_SERVICE_NAME)) {
+ this._oVirtCredentialsManager.resetToken();
+ this._preemptingService = null;
+ this._verificationFailed(false);
+ return;
+ }
+
// if the password service fails, then cancel everything.
// But if, e.g., fingerprint fails, still give
// password authentication a chance to succeed
const GnomeSession = imports.misc.gnomeSession;
const Hash = imports.misc.hash;
const Layout = imports.ui.layout;
+const OVirt = imports.gdm.oVirt;
const LoginManager = imports.misc.loginManager;
const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main;
this._liftShield(true, 0);
}));
+ this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager();
+ this._oVirtCredentialsManager.connect('user-authenticated',
+ Lang.bind(this, function() {
+ if (this._isLocked)
+ this._liftShield(true, 0);
+ }));
+
this._inhibitor = null;
this._aboutToSuspend = false;
this._loginManager = LoginManager.getLoginManager();